<?php
namespace App\Models\Trade\Supply;

use Illuminate\Support\Facades\DB;
use App\Models\Model;

class SupplyModel extends Model
{

    const TABLENAME = 'tw_trade_supply';

    /**
     * 规格单位（规格不限）
     */
    const SIZE_UNIT_NONE = - 1;

    /**
     * 出售类型（现货）
     */
    const SALE_TYPE_NEW = 1;

    /**
     * 出售类型（预售）
     */
    const SALE_TYPE_MAKE = 2;

    /**
     * 价格类型（自定义）
     */
    const PRICE_TYPE_CUSTOM = 1;

    /**
     * 价格类型（面议）
     */
    const PRICE_TYPE_MMJM = 2;

    /**
     * 状态（上架）
     */
    const STATUS_DEFAULT = 1;

    /**
     * 状态（下架）
     */
    const STATUS_LEAVE = 2;

    /**
     * 状态（删除）
     */
    const STATUS_REMOVE = 3;

    /**
     * 审核状态（审核中）
     */
    const AUDITING_AFOOT = 1;

    /**
     * 审核状态（通过）
     */
    const AUDITING_FINISH = 2;

    /**
     * 审核状态（不通过）
     */
    const AUDITING_REJECT = 3;

    /**
     * 发布类型（用户发布）
     */
    const PUBLISH_USER = 1;

    /**
     * 发布类型（运营电话）
     */
    const PUBLISH_MOBILE = 2;

    /**
     * 发布类型（运营语音）
     */
    const PUBLISH_VOIP = 3;

    /**
     * 发布类型（管理员发布）
     */
    const PUBLISH_ADMIN = 4;

    /**
     * 列表排序（最新发布）默认排序
     */
    const ORDER_DEFAULT = 1;

    /**
     * 列表排序（价格由低到高）
     */
    const ORDER_PRICE_ASC = 2;

    /**
     * 列表排序（价格由高到低）
     */
    const ORDER_PRICE_DESC = 3;

    /**
     * 认证状态（已认证+未认证）默认
     */
    const VERIFY_DEFAULT = 0;

    /**
     * 认证状态（已认证）
     */
    const VERIFY_TRUE = 1;

    /**
     * 获取出售类型列表
     *
     * @return array
     */
    public static function getSaleTypeList()
    {
        return [
            self::SALE_TYPE_NEW,
            self::SALE_TYPE_MAKE
        ];
    }

    /**
     * 获取预售 day 列表
     *
     * @return array
     */
    public static function getSalePresaleDayList()
    {
        return [
            '上旬',
            '中旬',
            '下旬'
        ];
    }

    /**
     * 获取价格类型列表
     *
     * @return array
     */
    public static function getPriceTypeList()
    {
        return [
            self::PRICE_TYPE_CUSTOM,
            self::PRICE_TYPE_MMJM
        ];
    }

    /**
     * 获取状态列表
     *
     * @return array
     */
    public static function getStatusList()
    {
        return [
            self::STATUS_DEFAULT,
            self::STATUS_LEAVE,
            self::STATUS_REMOVE
        ];
    }

    /**
     * 获取排序列表
     *
     * @return array
     */
    public static function getOrderList()
    {
        return [
            self::ORDER_DEFAULT,
            self::ORDER_PRICE_ASC,
            self::ORDER_PRICE_DESC
        ];
    }

    /**
     * 获取认证状态列表
     *
     * @return array
     */
    public static function getVerifyList()
    {
        return [
            self::VERIFY_DEFAULT,
            self::VERIFY_TRUE
        ];
    }

    /**
     * 查询一条数据
     *
     * @param int $id
     * @param array $fields
     * @return \Illuminate\Support\Collection
     */
    public static function findById($id, array $fields = [])
    {
        $query = self::dbTable();
        if (count($fields)) {
            $query->select($fields);
        }
        
        return $query->where('id', $id)->get();
    }

    /**
     * 添加一条数据
     *
     * @param array $data            
     * @return id
     */
    public static function addItem(array $data = [])
    {
        $data['sn'] = self::getUniqueNumber();
        $data['created'] = $data['updated'] = time();
        
        return self::dbTable()->insertGetId($data);
    }

    /**
     * 编辑一条数据
     *
     * @param int $id            
     * @param array $data            
     * @return false | 1 | 0
     */
    public static function editItem($id, array $data = [])
    {
        if (! $id) {
            return false;
        }
        $data['status'] = self::STATUS_DEFAULT;
        $data['auditing'] = self::AUDITING_AFOOT;
        $data['updated'] = time();
        
        return self::dbTable()->where('id', $id)->update($data);
    }

    /**
     * 删除一条数据（逻辑删除）
     *
     * @param int $id            
     * @return false | 1 | 0（删除条数，0未删除）
     */
    public static function banItem($id)
    {
        if (! $id) {
            return false;
        }
        $data['status'] = self::STATUS_REMOVE;
        $data['updated'] = time();
        
        return self::dbTable()->where('id', $id)->update($data);
    }

    /**
     * 修改状态
     *
     * @param int $id            
     * @param int $status            
     * @return false | 1 | 0（修改条数，0未修改）
     */
    public static function editItemStatus($id, $status)
    {
        if (! $id || ! in_array($status, self::getStatusList())) {
            return false;
        }
        $data['status'] = $status;
        $data['updated'] = time();
        // 上架修改默认有效期7天
        if ($status == self::STATUS_DEFAULT) {
            $data['valided'] = $data['updated'] + 86400 * 7;
        }
        
        return self::dbTable()->where('id', $id)->update($data);
    }

    /**
     * 刷新数据
     *
     * @param int $id            
     * @return false | 1 | 0（修改条数，0未修改）
     */
    public static function refreshItem($id)
    {
        if (! $id) {
            return false;
        }
        $data['updated'] = time();
        
        return self::dbTable()->where('id', $id)->update($data);
    }

    /**
     * 获取唯一单号
     * 
     * @return string
     */
    public static function getUniqueNumber()
    {
        $data = DB::select('call proc_trade_supply_number_get()');
        return $data[0]['sn'];
    }
}
